home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2009 February / PCWFEB09.iso / Software / Linux / Kubuntu 8.10 / kubuntu-8.10-desktop-i386.iso / casper / filesystem.squashfs / usr / include / linux / firewire-cdev.h < prev    next >
C/C++ Source or Header  |  2008-10-24  |  17KB  |  478 lines

  1. /*
  2.  * Char device interface.
  3.  *
  4.  * Copyright (C) 2005-2006  Kristian Hoegsberg <krh@bitplanet.net>
  5.  *
  6.  * This program is free software; you can redistribute it and/or modify
  7.  * it under the terms of the GNU General Public License as published by
  8.  * the Free Software Foundation; either version 2 of the License, or
  9.  * (at your option) any later version.
  10.  *
  11.  * This program is distributed in the hope that it will be useful,
  12.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14.  * GNU General Public License for more details.
  15.  *
  16.  * You should have received a copy of the GNU General Public License
  17.  * along with this program; if not, write to the Free Software Foundation,
  18.  * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  19.  */
  20.  
  21. #ifndef _LINUX_FIREWIRE_CDEV_H
  22. #define _LINUX_FIREWIRE_CDEV_H
  23.  
  24. #include <linux/ioctl.h>
  25. #include <linux/types.h>
  26. #include <linux/firewire-constants.h>
  27.  
  28. #define FW_CDEV_EVENT_BUS_RESET        0x00
  29. #define FW_CDEV_EVENT_RESPONSE        0x01
  30. #define FW_CDEV_EVENT_REQUEST        0x02
  31. #define FW_CDEV_EVENT_ISO_INTERRUPT    0x03
  32.  
  33. /**
  34.  * struct fw_cdev_event_common - Common part of all fw_cdev_event_ types
  35.  * @closure:    For arbitrary use by userspace
  36.  * @type:    Discriminates the fw_cdev_event_ types
  37.  *
  38.  * This struct may be used to access generic members of all fw_cdev_event_
  39.  * types regardless of the specific type.
  40.  *
  41.  * Data passed in the @closure field for a request will be returned in the
  42.  * corresponding event.  It is big enough to hold a pointer on all platforms.
  43.  * The ioctl used to set @closure depends on the @type of event.
  44.  */
  45. struct fw_cdev_event_common {
  46.     __u64 closure;
  47.     __u32 type;
  48. };
  49.  
  50. /**
  51.  * struct fw_cdev_event_bus_reset - Sent when a bus reset occurred
  52.  * @closure:    See &fw_cdev_event_common; set by %FW_CDEV_IOC_GET_INFO ioctl
  53.  * @type:    See &fw_cdev_event_common; always %FW_CDEV_EVENT_BUS_RESET
  54.  * @node_id:       New node ID of this node
  55.  * @local_node_id: Node ID of the local node, i.e. of the controller
  56.  * @bm_node_id:    Node ID of the bus manager
  57.  * @irm_node_id:   Node ID of the iso resource manager
  58.  * @root_node_id:  Node ID of the root node
  59.  * @generation:    New bus generation
  60.  *
  61.  * This event is sent when the bus the device belongs to goes through a bus
  62.  * reset.  It provides information about the new bus configuration, such as
  63.  * new node ID for this device, new root ID, and others.
  64.  */
  65. struct fw_cdev_event_bus_reset {
  66.     __u64 closure;
  67.     __u32 type;
  68.     __u32 node_id;
  69.     __u32 local_node_id;
  70.     __u32 bm_node_id;
  71.     __u32 irm_node_id;
  72.     __u32 root_node_id;
  73.     __u32 generation;
  74. };
  75.  
  76. /**
  77.  * struct fw_cdev_event_response - Sent when a response packet was received
  78.  * @closure:    See &fw_cdev_event_common;
  79.  *        set by %FW_CDEV_IOC_SEND_REQUEST ioctl
  80.  * @type:    See &fw_cdev_event_common; always %FW_CDEV_EVENT_RESPONSE
  81.  * @rcode:    Response code returned by the remote node
  82.  * @length:    Data length, i.e. the response's payload size in bytes
  83.  * @data:    Payload data, if any
  84.  *
  85.  * This event is sent when the stack receives a response to an outgoing request
  86.  * sent by %FW_CDEV_IOC_SEND_REQUEST ioctl.  The payload data for responses
  87.  * carrying data (read and lock responses) follows immediately and can be
  88.  * accessed through the @data field.
  89.  */
  90. struct fw_cdev_event_response {
  91.     __u64 closure;
  92.     __u32 type;
  93.     __u32 rcode;
  94.     __u32 length;
  95.     __u32 data[0];
  96. };
  97.  
  98. /**
  99.  * struct fw_cdev_event_request - Sent on incoming request to an address region
  100.  * @closure:    See &fw_cdev_event_common; set by %FW_CDEV_IOC_ALLOCATE ioctl
  101.  * @type:    See &fw_cdev_event_common; always %FW_CDEV_EVENT_REQUEST
  102.  * @tcode:    Transaction code of the incoming request
  103.  * @offset:    The offset into the 48-bit per-node address space
  104.  * @handle:    Reference to the kernel-side pending request
  105.  * @length:    Data length, i.e. the request's payload size in bytes
  106.  * @data:    Incoming data, if any
  107.  *
  108.  * This event is sent when the stack receives an incoming request to an address
  109.  * region registered using the %FW_CDEV_IOC_ALLOCATE ioctl.  The request is
  110.  * guaranteed to be completely contained in the specified region.  Userspace is
  111.  * responsible for sending the response by %FW_CDEV_IOC_SEND_RESPONSE ioctl,
  112.  * using the same @handle.
  113.  *
  114.  * The payload data for requests carrying data (write and lock requests)
  115.  * follows immediately and can be accessed through the @data field.
  116.  */
  117. struct fw_cdev_event_request {
  118.     __u64 closure;
  119.     __u32 type;
  120.     __u32 tcode;
  121.     __u64 offset;
  122.     __u32 handle;
  123.     __u32 length;
  124.     __u32 data[0];
  125. };
  126.  
  127. /**
  128.  * struct fw_cdev_event_iso_interrupt - Sent when an iso packet was completed
  129.  * @closure:    See &fw_cdev_event_common;
  130.  *        set by %FW_CDEV_CREATE_ISO_CONTEXT ioctl
  131.  * @type:    See &fw_cdev_event_common; always %FW_CDEV_EVENT_ISO_INTERRUPT
  132.  * @cycle:    Cycle counter of the interrupt packet
  133.  * @header_length: Total length of following headers, in bytes
  134.  * @header:    Stripped headers, if any
  135.  *
  136.  * This event is sent when the controller has completed an &fw_cdev_iso_packet
  137.  * with the %FW_CDEV_ISO_INTERRUPT bit set.  In the receive case, the headers
  138.  * stripped of all packets up until and including the interrupt packet are
  139.  * returned in the @header field.
  140.  */
  141. struct fw_cdev_event_iso_interrupt {
  142.     __u64 closure;
  143.     __u32 type;
  144.     __u32 cycle;
  145.     __u32 header_length;
  146.     __u32 header[0];
  147. };
  148.  
  149. /**
  150.  * union fw_cdev_event - Convenience union of fw_cdev_event_ types
  151.  * @common:        Valid for all types
  152.  * @bus_reset:     Valid if @common.type == %FW_CDEV_EVENT_BUS_RESET
  153.  * @response:      Valid if @common.type == %FW_CDEV_EVENT_RESPONSE
  154.  * @request:       Valid if @common.type == %FW_CDEV_EVENT_REQUEST
  155.  * @iso_interrupt: Valid if @common.type == %FW_CDEV_EVENT_ISO_INTERRUPT
  156.  *
  157.  * Convenience union for userspace use.  Events could be read(2) into a char
  158.  * buffer and then cast to this union for further processing.
  159.  */
  160. union fw_cdev_event {
  161.     struct fw_cdev_event_common common;
  162.     struct fw_cdev_event_bus_reset bus_reset;
  163.     struct fw_cdev_event_response response;
  164.     struct fw_cdev_event_request request;
  165.     struct fw_cdev_event_iso_interrupt iso_interrupt;
  166. };
  167.  
  168. #define FW_CDEV_IOC_GET_INFO        _IOWR('#', 0x00, struct fw_cdev_get_info)
  169. #define FW_CDEV_IOC_SEND_REQUEST    _IOW('#', 0x01, struct fw_cdev_send_request)
  170. #define FW_CDEV_IOC_ALLOCATE        _IOWR('#', 0x02, struct fw_cdev_allocate)
  171. #define FW_CDEV_IOC_DEALLOCATE        _IOW('#', 0x03, struct fw_cdev_deallocate)
  172. #define FW_CDEV_IOC_SEND_RESPONSE    _IOW('#', 0x04, struct fw_cdev_send_response)
  173. #define FW_CDEV_IOC_INITIATE_BUS_RESET    _IOW('#', 0x05, struct fw_cdev_initiate_bus_reset)
  174. #define FW_CDEV_IOC_ADD_DESCRIPTOR    _IOWR('#', 0x06, struct fw_cdev_add_descriptor)
  175. #define FW_CDEV_IOC_REMOVE_DESCRIPTOR    _IOW('#', 0x07, struct fw_cdev_remove_descriptor)
  176.  
  177. #define FW_CDEV_IOC_CREATE_ISO_CONTEXT    _IOWR('#', 0x08, struct fw_cdev_create_iso_context)
  178. #define FW_CDEV_IOC_QUEUE_ISO        _IOWR('#', 0x09, struct fw_cdev_queue_iso)
  179. #define FW_CDEV_IOC_START_ISO        _IOW('#', 0x0a, struct fw_cdev_start_iso)
  180. #define FW_CDEV_IOC_STOP_ISO        _IOW('#', 0x0b, struct fw_cdev_stop_iso)
  181. #define FW_CDEV_IOC_GET_CYCLE_TIMER    _IOR('#', 0x0c, struct fw_cdev_get_cycle_timer)
  182.  
  183. /* FW_CDEV_VERSION History
  184.  *
  185.  * 1    Feb 18, 2007:  Initial version.
  186.  */
  187. #define FW_CDEV_VERSION        1
  188.  
  189. /**
  190.  * struct fw_cdev_get_info - General purpose information ioctl
  191.  * @version:    The version field is just a running serial number.
  192.  *        We never break backwards compatibility, but may add more
  193.  *        structs and ioctls in later revisions.
  194.  * @rom_length:    If @rom is non-zero, at most rom_length bytes of configuration
  195.  *        ROM will be copied into that user space address.  In either
  196.  *        case, @rom_length is updated with the actual length of the
  197.  *        configuration ROM.
  198.  * @rom:    If non-zero, address of a buffer to be filled by a copy of the
  199.  *        local node's configuration ROM
  200.  * @bus_reset:    If non-zero, address of a buffer to be filled by a
  201.  *        &struct fw_cdev_event_bus_reset with the current state
  202.  *        of the bus.  This does not cause a bus reset to happen.
  203.  * @bus_reset_closure: Value of &closure in this and subsequent bus reset events
  204.  * @card:    The index of the card this device belongs to
  205.  */
  206. struct fw_cdev_get_info {
  207.     __u32 version;
  208.     __u32 rom_length;
  209.     __u64 rom;
  210.     __u64 bus_reset;
  211.     __u64 bus_reset_closure;
  212.     __u32 card;
  213. };
  214.  
  215. /**
  216.  * struct fw_cdev_send_request - Send an asynchronous request packet
  217.  * @tcode:    Transaction code of the request
  218.  * @length:    Length of outgoing payload, in bytes
  219.  * @offset:    48-bit offset at destination node
  220.  * @closure:    Passed back to userspace in the response event
  221.  * @data:    Userspace pointer to payload
  222.  * @generation:    The bus generation where packet is valid
  223.  *
  224.  * Send a request to the device.  This ioctl implements all outgoing requests.
  225.  * Both quadlet and block request specify the payload as a pointer to the data
  226.  * in the @data field.  Once the transaction completes, the kernel writes an
  227.  * &fw_cdev_event_request event back.  The @closure field is passed back to
  228.  * user space in the response event.
  229.  */
  230. struct fw_cdev_send_request {
  231.     __u32 tcode;
  232.     __u32 length;
  233.     __u64 offset;
  234.     __u64 closure;
  235.     __u64 data;
  236.     __u32 generation;
  237. };
  238.  
  239. /**
  240.  * struct fw_cdev_send_response - Send an asynchronous response packet
  241.  * @rcode:    Response code as determined by the userspace handler
  242.  * @length:    Length of outgoing payload, in bytes
  243.  * @data:    Userspace pointer to payload
  244.  * @handle:    The handle from the &fw_cdev_event_request
  245.  *
  246.  * Send a response to an incoming request.  By setting up an address range using
  247.  * the %FW_CDEV_IOC_ALLOCATE ioctl, userspace can listen for incoming requests.  An
  248.  * incoming request will generate an %FW_CDEV_EVENT_REQUEST, and userspace must
  249.  * send a reply using this ioctl.  The event has a handle to the kernel-side
  250.  * pending transaction, which should be used with this ioctl.
  251.  */
  252. struct fw_cdev_send_response {
  253.     __u32 rcode;
  254.     __u32 length;
  255.     __u64 data;
  256.     __u32 handle;
  257. };
  258.  
  259. /**
  260.  * struct fw_cdev_allocate - Allocate a CSR address range
  261.  * @offset:    Start offset of the address range
  262.  * @closure:    To be passed back to userspace in request events
  263.  * @length:    Length of the address range, in bytes
  264.  * @handle:    Handle to the allocation, written by the kernel
  265.  *
  266.  * Allocate an address range in the 48-bit address space on the local node
  267.  * (the controller).  This allows userspace to listen for requests with an
  268.  * offset within that address range.  When the kernel receives a request
  269.  * within the range, an &fw_cdev_event_request event will be written back.
  270.  * The @closure field is passed back to userspace in the response event.
  271.  * The @handle field is an out parameter, returning a handle to the allocated
  272.  * range to be used for later deallocation of the range.
  273.  */
  274. struct fw_cdev_allocate {
  275.     __u64 offset;
  276.     __u64 closure;
  277.     __u32 length;
  278.     __u32 handle;
  279. };
  280.  
  281. /**
  282.  * struct fw_cdev_deallocate - Free an address range allocation
  283.  * @handle:    Handle to the address range, as returned by the kernel when the
  284.  *        range was allocated
  285.  */
  286. struct fw_cdev_deallocate {
  287.     __u32 handle;
  288. };
  289.  
  290. #define FW_CDEV_LONG_RESET    0
  291. #define FW_CDEV_SHORT_RESET    1
  292.  
  293. /**
  294.  * struct fw_cdev_initiate_bus_reset - Initiate a bus reset
  295.  * @type:    %FW_CDEV_SHORT_RESET or %FW_CDEV_LONG_RESET
  296.  *
  297.  * Initiate a bus reset for the bus this device is on.  The bus reset can be
  298.  * either the original (long) bus reset or the arbitrated (short) bus reset
  299.  * introduced in 1394a-2000.
  300.  */
  301. struct fw_cdev_initiate_bus_reset {
  302.     __u32 type;    /* FW_CDEV_SHORT_RESET or FW_CDEV_LONG_RESET */
  303. };
  304.  
  305. /**
  306.  * struct fw_cdev_add_descriptor - Add contents to the local node's config ROM
  307.  * @immediate:    If non-zero, immediate key to insert before pointer
  308.  * @key:    Upper 8 bits of root directory pointer
  309.  * @data:    Userspace pointer to contents of descriptor block
  310.  * @length:    Length of descriptor block data, in bytes
  311.  * @handle:    Handle to the descriptor, written by the kernel
  312.  *
  313.  * Add a descriptor block and optionally a preceding immediate key to the local
  314.  * node's configuration ROM.
  315.  *
  316.  * The @key field specifies the upper 8 bits of the descriptor root directory
  317.  * pointer and the @data and @length fields specify the contents. The @key
  318.  * should be of the form 0xXX000000. The offset part of the root directory entry
  319.  * will be filled in by the kernel.
  320.  *
  321.  * If not 0, the @immediate field specifies an immediate key which will be
  322.  * inserted before the root directory pointer.
  323.  *
  324.  * If successful, the kernel adds the descriptor and writes back a handle to the
  325.  * kernel-side object to be used for later removal of the descriptor block and
  326.  * immediate key.
  327.  */
  328. struct fw_cdev_add_descriptor {
  329.     __u32 immediate;
  330.     __u32 key;
  331.     __u64 data;
  332.     __u32 length;
  333.     __u32 handle;
  334. };
  335.  
  336. /**
  337.  * struct fw_cdev_remove_descriptor - Remove contents from the configuration ROM
  338.  * @handle:    Handle to the descriptor, as returned by the kernel when the
  339.  *        descriptor was added
  340.  *
  341.  * Remove a descriptor block and accompanying immediate key from the local
  342.  * node's configuration ROM.
  343.  */
  344. struct fw_cdev_remove_descriptor {
  345.     __u32 handle;
  346. };
  347.  
  348. #define FW_CDEV_ISO_CONTEXT_TRANSMIT    0
  349. #define FW_CDEV_ISO_CONTEXT_RECEIVE    1
  350.  
  351. /**
  352.  * struct fw_cdev_create_iso_context - Create a context for isochronous IO
  353.  * @type:    %FW_CDEV_ISO_CONTEXT_TRANSMIT or %FW_CDEV_ISO_CONTEXT_RECEIVE
  354.  * @header_size: Header size to strip for receive contexts
  355.  * @channel:    Channel to bind to
  356.  * @speed:    Speed to transmit at
  357.  * @closure:    To be returned in &fw_cdev_event_iso_interrupt
  358.  * @handle:    Handle to context, written back by kernel
  359.  *
  360.  * Prior to sending or receiving isochronous I/O, a context must be created.
  361.  * The context records information about the transmit or receive configuration
  362.  * and typically maps to an underlying hardware resource.  A context is set up
  363.  * for either sending or receiving.  It is bound to a specific isochronous
  364.  * channel.
  365.  *
  366.  * If a context was successfully created, the kernel writes back a handle to the
  367.  * context, which must be passed in for subsequent operations on that context.
  368.  */
  369. struct fw_cdev_create_iso_context {
  370.     __u32 type;
  371.     __u32 header_size;
  372.     __u32 channel;
  373.     __u32 speed;
  374.     __u64 closure;
  375.     __u32 handle;
  376. };
  377.  
  378. #define FW_CDEV_ISO_PAYLOAD_LENGTH(v)    (v)
  379. #define FW_CDEV_ISO_INTERRUPT        (1 << 16)
  380. #define FW_CDEV_ISO_SKIP        (1 << 17)
  381. #define FW_CDEV_ISO_SYNC        (1 << 17)
  382. #define FW_CDEV_ISO_TAG(v)        ((v) << 18)
  383. #define FW_CDEV_ISO_SY(v)        ((v) << 20)
  384. #define FW_CDEV_ISO_HEADER_LENGTH(v)    ((v) << 24)
  385.  
  386. /**
  387.  * struct fw_cdev_iso_packet - Isochronous packet
  388.  * @control:    Contains the header length (8 uppermost bits), the sy field
  389.  *        (4 bits), the tag field (2 bits), a sync flag (1 bit),
  390.  *        a skip flag (1 bit), an interrupt flag (1 bit), and the
  391.  *        payload length (16 lowermost bits)
  392.  * @header:    Header and payload
  393.  *
  394.  * &struct fw_cdev_iso_packet is used to describe isochronous packet queues.
  395.  *
  396.  * Use the FW_CDEV_ISO_ macros to fill in @control.  The sy and tag fields are
  397.  * specified by IEEE 1394a and IEC 61883.
  398.  *
  399.  * FIXME - finish this documentation
  400.  */
  401. struct fw_cdev_iso_packet {
  402.     __u32 control;
  403.     __u32 header[0];
  404. };
  405.  
  406. /**
  407.  * struct fw_cdev_queue_iso - Queue isochronous packets for I/O
  408.  * @packets:    Userspace pointer to packet data
  409.  * @data:    Pointer into mmap()'ed payload buffer
  410.  * @size:    Size of packet data in bytes
  411.  * @handle:    Isochronous context handle
  412.  *
  413.  * Queue a number of isochronous packets for reception or transmission.
  414.  * This ioctl takes a pointer to an array of &fw_cdev_iso_packet structs,
  415.  * which describe how to transmit from or receive into a contiguous region
  416.  * of a mmap()'ed payload buffer.  As part of the packet descriptors,
  417.  * a series of headers can be supplied, which will be prepended to the
  418.  * payload during DMA.
  419.  *
  420.  * The kernel may or may not queue all packets, but will write back updated
  421.  * values of the @packets, @data and @size fields, so the ioctl can be
  422.  * resubmitted easily.
  423.  */
  424. struct fw_cdev_queue_iso {
  425.     __u64 packets;
  426.     __u64 data;
  427.     __u32 size;
  428.     __u32 handle;
  429. };
  430.  
  431. #define FW_CDEV_ISO_CONTEXT_MATCH_TAG0         1
  432. #define FW_CDEV_ISO_CONTEXT_MATCH_TAG1         2
  433. #define FW_CDEV_ISO_CONTEXT_MATCH_TAG2         4
  434. #define FW_CDEV_ISO_CONTEXT_MATCH_TAG3         8
  435. #define FW_CDEV_ISO_CONTEXT_MATCH_ALL_TAGS    15
  436.  
  437. /**
  438.  * struct fw_cdev_start_iso - Start an isochronous transmission or reception
  439.  * @cycle:    Cycle in which to start I/O.  If @cycle is greater than or
  440.  *        equal to 0, the I/O will start on that cycle.
  441.  * @sync:    Determines the value to wait for for receive packets that have
  442.  *        the %FW_CDEV_ISO_SYNC bit set
  443.  * @tags:    Tag filter bit mask.  Only valid for isochronous reception.
  444.  *        Determines the tag values for which packets will be accepted.
  445.  *        Use FW_CDEV_ISO_CONTEXT_MATCH_ macros to set @tags.
  446.  * @handle:    Isochronous context handle within which to transmit or receive
  447.  */
  448. struct fw_cdev_start_iso {
  449.     __s32 cycle;
  450.     __u32 sync;
  451.     __u32 tags;
  452.     __u32 handle;
  453. };
  454.  
  455. /**
  456.  * struct fw_cdev_stop_iso - Stop an isochronous transmission or reception
  457.  * @handle:    Handle of isochronous context to stop
  458.  */
  459. struct fw_cdev_stop_iso {
  460.     __u32 handle;
  461. };
  462.  
  463. /**
  464.  * struct fw_cdev_get_cycle_timer - read cycle timer register
  465.  * @local_time:   system time, in microseconds since the Epoch
  466.  * @cycle_timer:  isochronous cycle timer, as per OHCI 1.1 clause 5.13
  467.  *
  468.  * The %FW_CDEV_IOC_GET_CYCLE_TIMER ioctl reads the isochronous cycle timer
  469.  * and also the system clock.  This allows to express the receive time of an
  470.  * isochronous packet as a system time with microsecond accuracy.
  471.  */
  472. struct fw_cdev_get_cycle_timer {
  473.     __u64 local_time;
  474.     __u32 cycle_timer;
  475. };
  476.  
  477. #endif /* _LINUX_FIREWIRE_CDEV_H */
  478.